/*
 * @Description: 地图相关
 * @Author: liushuang
 * @Date: 2022-04-14 18:11:55
 * @LastEditTime: 2022-12-05 17:20:34
 */
import AMapLoader from '@amap/amap-jsapi-loader' // 高德地图插件
import { shallowRef } from 'vue'
import { ElMessage } from 'element-plus'

// 高德密匙
// eslint-disable-next-line no-underscore-dangle
window._AMapSecurityConfig = {
  securityJsCode: '6095921c39af0eac3ba5f3aeab31d7a2'
}

const KEY = '789b191dc61cde906cda775a1fd7edf2' // 开发者Key
const MAP_STYLE = 'amap://styles/ef247a3f61dfd2a88e1693022e7006a0' // 自定义地图样式链接

function initRealMap(data, map, AMapBase) {
  const {
    viewMode, pitch, zoom, center, mapStyle, id, catchFn
  } = {
    viewMode: '3D',
    pitch: 52,
    zoom: 17,
    center: [106.47, 29.563485],
    mapStyle: true,
    id: null,
    catchFn: null,
    ...data
  }
  AMapLoader.load({
    key: KEY, // 申请好的Web端开发者Key，首次调用 load 时必填
    version: '2.0', // 指定要加载的 JSAPI 的版本，缺省时默认为 1.4.15
    plugins: [
      'AMap.MarkerCluster',
      'AMap.MoveAnimation',
      'AMap.PolygonEditor',
      'AMap.PolylineEditor',
      'AMap.PlaceSearch'
    ] // 需要使用的的插件列表，如比例尺'AMap.Scale'等
  })
    .then((AMap) => {
      // eslint-disable-next-line no-param-reassign
      AMapBase.value = AMap
      // eslint-disable-next-line no-param-reassign
      map.value = new AMapBase.value.Map(id, {
        mapStyle: mapStyle ? MAP_STYLE : 'amap://styles/normal', // 自定义地图样式
        resizeEnable: true, // 是否监控地图容器尺寸变化，默认值为false
        terrain: true,
        pitch, // 地图俯仰角度，有效范围 0 度- 83 度
        // 设置地图容器id
        viewMode, // 是否为3D地图模式
        zoom, // 初始化地图级别
        center // 初始化地图中心点位置
        // layers: [
        //   new AMap.TileLayer.Satellite()
        // ]
      })
    })
    .catch(
      catchFn
        || ((err) => {
          if (!id) {
            ElMessage.error('地图加载失败，请指定容器id')
          } else {
            ElMessage.error(`地图加载失败,${err}`)
          }
        })
    )
}

/**
 * @desc: 初始化地图
 * @param {Object} data {viewMode, pitch, zoom, center, mapStyle, id, catchFn}
 * @return {Object} { map, AMapBase }
 */
export default function initMap(data) {
  const AMapBase = shallowRef(null)
  const map = shallowRef(null)
  initRealMap(data, map, AMapBase)
  return { map, AMapBase }
}
